/***********************************************************************
 * Module:  Client.java
 * Author:  Simon
 * Purpose: Defines the Class Client
 ***********************************************************************/

package Modele;

import java.util.*;

import DAO.DAOLocation;

/** Objet définissant les cliens */
public class Client {
	/** Identifiant du client */
	private int idClient;
	/** Nom du client */
	private String nom;
	/** Prénom du client */
	private String prenom;
	/** Date de naissance du client */
	private Date dateDeNaissance;
	/** Lieu de naissance du client */
	private String lieuDeNaissance;
	/** Flag d'activité */
	private boolean estActif;

	/**
	 * Instancite un nouveau client
	 * 
	 * @param nom
	 *            Nom du client
	 * @param prenom
	 *            Prénom du client
	 * @param dateDeNaissance
	 *            Date de naissance du client
	 * @param lieuDeNaissance
	 *            Lieu de naissance du client
	 * @param estActif
	 *            Le flag d'activité
	 */
	public Client(String nom, String prenom, Date dateDeNaissance,
			String lieuDeNaissance, boolean estActif) {
		this.nom = nom;
		this.prenom = prenom;
		this.dateDeNaissance = dateDeNaissance;
		this.lieuDeNaissance = lieuDeNaissance;
		this.estActif = estActif;
	}

	/**
	 * Instancite un nouveau client
	 * 
	 * @param idClient
	 *            Identifiant du client
	 * @param nom
	 *            Nom du client
	 * @param prenom
	 *            Prénom du client
	 * @param dateDeNaissance
	 *            Date de naissance du client
	 * @param lieuDeNaissance
	 *            Lieu de naissance du client
	 * @param estActif
	 *            Le flag d'activité
	 */
	public Client(int idClient, String nom, String prenom,
			Date dateDeNaissance, String lieuDeNaissance, boolean estActif) {
		this.idClient = idClient;
		this.nom = nom;
		this.prenom = prenom;
		this.dateDeNaissance = dateDeNaissance;
		this.lieuDeNaissance = lieuDeNaissance;
		this.estActif = estActif;
	}

	/**
	 * Renvoie l'identifiant du client
	 * 
	 * @return L'identifiant
	 */
	public int getIdClient() {
		return idClient;
	}

	/**
	 * Renvoie le nom du client
	 * 
	 * @return Le nom
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * Assigne le nom du client
	 * 
	 * @param newNom
	 *            Le nouveau nom
	 */
	public void setNom(String newNom) {
		nom = newNom;
	}

	/**
	 * Renvoie le prénom du client
	 * 
	 * @return Le prénom
	 */
	public String getPrenom() {
		return prenom;
	}

	/**
	 * Assigne le prénom du client
	 * 
	 * @param newPrenom
	 *            Le nouveau prénom
	 */
	public void setPrenom(String newPrenom) {
		prenom = newPrenom;
	}

	/**
	 * Renvoie la date de naissance du client
	 * 
	 * @return La date de naissance
	 */
	public Date getDateDeNaissance() {
		return dateDeNaissance;
	}

	/**
	 * Assigne la date de naissance du client
	 * 
	 * @param newDateDeNaissance
	 *            La nouvelle date de naissance
	 */
	public void setDateDeNaissance(Date newDateDeNaissance) {
		dateDeNaissance = newDateDeNaissance;
	}

	/**
	 * Renvoie le lieu de naissance du client
	 * 
	 * @return Le lieu de naissance
	 */
	public String getLieuDeNaissance() {
		return lieuDeNaissance;
	}

	/**
	 * Assigne le lieu de naissance du client
	 * 
	 * @param newLieuDeNaissance
	 *            Le nouveau lieu de naissance
	 */
	public void setLieuDeNaissance(String newLieuDeNaissance) {
		lieuDeNaissance = newLieuDeNaissance;
	}

	/**
	 * Renvoie la liste des vélos que le client a loué
	 * 
	 * @return La liste de vélos
	 */
	public ArrayList<Location> getLocations() {
		ArrayList<Location> locations = new ArrayList<Location>();

		for (Location loc : DAOLocation.getAllLocation()) {
			if (loc.getIdClient() == getIdClient())
				locations.add(loc);
		}

		return locations;
	}

	/**
	 * Renvoie la location actuelle du client
	 * @return La location du client
	 */
	public Location getLocationActuelle() {
		for (Location loc : getLocations()) {
			if (loc.getDateDeFin() == null)
				return loc;
		}
		return null;
	}

	/**
	 * Renvoie le vélo actuel du client, ou null
	 * 
	 * @return La liste de vélos
	 */
	public Velo getVeloActuel() {
		Velo velo = null;
		Location loc = getLocationActuelle();

		if (loc != null && loc.getDateDeFin() == null) {
			velo = loc.getVelo();
		}

		return velo;
	}

	/**
	 * Indique si le client loue un vélo actuellement
	 * @return Flag de location
	 */
	public boolean loueUnVeloActuellement() {
		return (!(this.getVeloActuel() == null));
	}

	/**
	 * Renvoie le flag d'activité
	 * 
	 * @return Le flag d'activité
	 */
	public boolean getEstActif() {
		return estActif;
	}

	/**
	 * Assigne le flag d'activité
	 * 
	 * @param newEstActif
	 */
	public void setEstActif(boolean newEstActif) {
		estActif = newEstActif;
	}

	/**
	 * Renvoie le nom et prénom du client
	 * @return Le nom et prénom du client
	 */
	@Override
	public String toString() {
		return getNom() + " " + getPrenom();
	}

}